#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import shutil
import subprocess
from pathlib import Path
import glob

def install_requirements(root_dir):
    """安装requirements.txt中的依赖"""
    requirements_file = os.path.join(root_dir, 'requirements.txt')
    
    if os.path.exists(requirements_file):
        print("使用依赖文件: requirements.txt")
    
    if os.path.exists(requirements_file):
        print(f"找到依赖文件: {requirements_file}")
        print("开始安装依赖...")
        
        try:
            # 使用pip安装requirements.txt中的依赖
            result = subprocess.run([
                sys.executable, "-m", "pip", "install", "-r", requirements_file
            ], check=True, capture_output=True, text=True)
            
            print("依赖安装成功!")
            print("已安装的依赖:")
            
            # 读取并显示安装的依赖
            with open(requirements_file, 'r', encoding='utf-8') as f:
                for line in f:
                    line = line.strip()
                    if line and not line.startswith('#'):
                        print(f"  - {line}")
                        
        except subprocess.CalledProcessError as e:
            print(f"安装依赖时出现错误: {e}")
            print("错误输出:", e.stderr)
            return False
            
        except Exception as e:
            print(f"安装依赖时出现未知错误: {e}")
            return False
    else:
        print(f"警告: 未找到依赖文件 {requirements_file}")
        print("跳过依赖安装...")
    
    return True

# 已移除DLL查找函数，演示程序无需额外DLL文件

def verify_resources(root_dir):
    """验证所需的资源文件是否存在（演示程序无需特殊资源）"""
    # 演示程序不需要额外的资源文件
    return []


def main():
    print("开始构建 Python Qt 演示程序的 Windows 目录版可执行文件...")
    
    # 项目根目录
    root_dir = Path(os.path.dirname(os.path.abspath(__file__)))
    print(f"项目根目录: {root_dir}")
    
    # 首先安装依赖
    print("\n=== 第一步：安装项目依赖 ===")
    if not install_requirements(root_dir):
        print("依赖安装失败，构建过程终止。")
        return 1
    
    # 确保PyInstaller已安装
    print("\n=== 第二步：验证PyInstaller ===")
    try:
        import PyInstaller
        print(f"PyInstaller版本: {PyInstaller.__version__}")
    except ImportError:
        print("未检测到PyInstaller，正在安装...")
        subprocess.call([sys.executable, "-m", "pip", "install", "pyinstaller"])
        print("PyInstaller安装完成")
    
    print("\n=== 第三步：准备构建环境 ===")
    # 创建输出目录
    dist_dir = root_dir / "dist"
    
    # 创建入口点文件 - 使用演示版本
    entry_file = os.path.join(root_dir, 'main.py') # 使用演示版本
    entry_file_rel = os.path.relpath(entry_file, root_dir)
    print(f"入口文件 (演示版本): {entry_file}")
    
    # 纯Qt演示程序，不需要额外的二进制文件
    binaries_list_str = "[]"
    
    print("\n=== 第四步：验证和准备资源文件 ===")
    # 演示程序无需额外资源文件
    resources = []
    resources_spec = "    # 演示程序无需额外资源文件\n"
    
    # 创建spec文件
    spec_content = f'''# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
    [r'{entry_file_rel}'],
    pathex=[r'{root_dir}'],
    binaries={binaries_list_str}, # 二进制文件
    datas=[], # datas for Analysis, will be extended
    hiddenimports=['PySide6.QtCore', 'PySide6.QtGui', 'PySide6.QtWidgets'],
    hookspath=[],
    hooksconfig={{}},
    runtime_hooks=[],
    excludes=['PyQt5', 'PyQt6', 'PyQt4', 'matplotlib', 'scipy.spatial', 'numpy.f2py', 'tkinter'],  # 排除不需要的库
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

# 添加资源文件到 Analysis 对象
a.datas += [
{resources_spec}]

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='PythonQtDemo',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=False,  # 隐藏控制台窗口
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=None,  # 演示程序无需图标
)

coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='PythonQtDemo',
)
'''
    
    print("\n=== 第五步：创建PyInstaller配置文件 ===")
    # 写入spec文件
    spec_path = root_dir / "PythonQtDemo-Dir.spec"
    with open(spec_path, 'w', encoding='utf-8') as f:
        f.write(spec_content)
    
    print(f"已创建spec文件: {spec_path}")
    
    print("\n=== 第六步：执行PyInstaller打包 ===")
    # 执行PyInstaller打包
    print("开始执行PyInstaller目录版打包...")
    cmd = [sys.executable, "-m", "PyInstaller", str(spec_path), "--clean", "--noconfirm"]
    result = subprocess.run(cmd, shell=True)
    
    if result.returncode == 0:
        print("\n=== 构建成功完成！ ===")
        print("Python Qt 演示程序目录版打包成功!")
        # For directory build, the exe is in dist_dir/PythonQtDemo/
        executable_path = dist_dir / 'PythonQtDemo' / 'PythonQtDemo.exe'
        print(f"可执行文件位置: {executable_path}")
        
        print("纯Qt界面演示程序，无需额外依赖。")
        
        print("\n=== 构建完成提示 ===")
        print(f"1. {executable_path.parent.name} 是一个目录版可执行程序。")
        print("2. 测试应用程序是否正常工作。")
        print("3. 如果有问题，请检查控制台输出的日志。")
        print("4. 所有依赖项已自动安装并打包。")
        print("5. 这是一个纯粹的 Python Qt 桌面应用开发演示程序。")
        
    else:
        print("\n=== 构建失败 ===")
        print("Python Qt 演示程序打包过程中出现错误!")
        print("请检查上述错误信息并解决相关问题。")
        
    return result.returncode
    
if __name__ == "__main__":
    sys.exit(main())